package com.example.demo.utils;

import com.example.demo.entity.FileNode;
import com.jcraft.jsch.SftpException;

import java.util.Vector;

public class TreeUtils {

    private static SFTPUtil sftpUtil = new SFTPUtil("root", "zgh/123456", "47.98.175.236", 22);

    /**
     * 根据用户的目录名去收集该用户目录下的文件夹，并且建成一棵多叉树
     * @param username 用户名
     * @param type 默认路径：file,header或者trash
     * @return 多叉树的根节点
     * @throws SftpException sftp异常
     */
    public static FileNode buildTree(String username,String type) throws SftpException {
        //首先我们已知这棵树的更目录，用这个更目录作为这棵树的root节点
        FileNode root=new FileNode();
        root.setDir(true);

        root.setName(FolderUtils.basePath+"/"+username+"/"+type);
        //以root节点开始，递归往下建立不同的子节点
        creatTree(root);
        cutTree(root);
        return root;
    }
    private static void creatTree(FileNode parent) throws SftpException {
        //父节点的name为该节点文件夹的路径，得到该路径可以到远程服务器上找到其下的目录文件
        String parenName=parent.getName();
        sftpUtil.login();
        //返回的vector为该父节点其下一层的子节点，其中包含的信息有子节点是否为文件夹和子节点的name(即路径)
        Vector<FileNode> fileList=(Vector<FileNode>) sftpUtil.listFiles(parenName);
        //将子节点的信息赋值给父节点的属性：childNodes
        parent.setChildNodes(fileList);
        //遍历子节点，如果子节点是文件夹，则递归去找子子节点
        for (FileNode file:fileList) {
            if(file.getDir()){
                creatTree(file);
            }
        }
    }
    private static void cutTree(FileNode root){
        StringBuilder path=new StringBuilder(root.getName());
        //因为/的原因，所以长度要加2
        String cutPath=path.substring(FolderUtils.basePath.length()+UserNameUtils.getUsername().length()+2);
        root.setName(cutPath);
        if(root.getChildNodes()!=null){
            for (FileNode fn:root.getChildNodes()) cutTree(fn);
        }

    }
}
